package com.sisgesbyte.services.administracion;

import java.util.ArrayList;
import java.util.List;

import javax.ejb.EJB;
import javax.ejb.Stateless;
import javax.inject.Inject;

import com.sisgesbyte.common.ConstModAdministracion;
import com.sisgesbyte.common.ConstantesInternasSistema;
import com.sisgesbyte.common.Validaciones;
import com.sisgesbyte.dao.administracion.MantenimientoPrecioProductoDao;
import com.sisgesbyte.dao.beanDao.FiltrosBean;
import com.sisgesbyte.dao.beanDao.FiltrosSQLBean;
import com.sisgesbyte.dao.beanDao.PrecioProductoRequest;
import com.sisgesbyte.data.entity.administracion.PrecioProductoEntity;
import com.sisgesbyte.data.entity.comun.GenericEntity;
import com.sisgesbyte.services.administracion.bean.BoletinBean;
import com.sisgesbyte.services.administracion.bean.BoletinUsuarioListaResponse;
import com.sisgesbyte.services.administracion.bean.PrecioProductoBean;
import com.sisgesbyte.services.administracion.bean.PrecioProductoListResponse;
import com.sisgesbyte.services.commonBean.GenericResponse;
import com.sisgesbyte.services.sistema.EmailSenderService;

@Stateless
public class MantenimientoPrecioProductoImpl implements
		MantenimientoPrecioProducto {

	@Inject
	private Validaciones validaciones;
	@EJB
	private MantenimientoPrecioProductoDao mantenimientoPrecioProductoDao;
	@EJB
	private EmailSenderService emailSenderService;
	@EJB
	private MantenimientoBoletin mantenimientoBoletin;
	
	@Override
	public PrecioProductoListResponse listaPrecioProducto( String codTransaccion, FiltrosSQLBean cadenaFiltros) {
		String mensajeTransaccionMetodo = "[listaPrecioProducto idTx=" + codTransaccion + "] - ";
		PrecioProductoListResponse response = new PrecioProductoListResponse();
		
		try{
			 response.setIdTransaccion(codTransaccion);
			 List<PrecioProductoEntity> resDao = null;
			try{
				resDao = mantenimientoPrecioProductoDao.listaPrecioProductos(cadenaFiltros);
			}catch(Exception e){
				System.out.println(mensajeTransaccionMetodo + "Hubo un error al listar " +e);
				response.setCodigoRespuesta(ConstModAdministracion.MANT_LISTAR_COD_IDT);
				response.setMensajeRespuesta(ConstModAdministracion.MANT_LISTAR_MSJ_IDT.replace("msj", mensajeTransaccionMetodo));
				return response;
			}
			
			if(resDao.size() > 0){
				List<PrecioProductoBean> lista = new ArrayList<PrecioProductoBean>();
				for(PrecioProductoEntity row : resDao){
					PrecioProductoBean bean = new PrecioProductoBean();
						bean.setActive(row.getActive());
						bean.setAlmacenId(row.getAlmacen_id());
						bean.setCampania(validaciones.validarCamposString(row.getCampania()));
						bean.setCategoriaCliente(validaciones.validarCamposString(row.getCategoria_cliente()));
						bean.setCategoriaClienteId(row.getCategoria_cliente_id());
						bean.setCodAlmacen(validaciones.validarCamposString(row.getCod_almacen()));
						bean.setCodProd(validaciones.validarCamposString(row.getCod_prod()));
						bean.setId(row.getId());
						bean.setPrecioCampana(row.getPrecio_campana());
						bean.setPrecioNormal(row.getPrecio_normal());
						bean.setProducto(validaciones.validarCamposString(row.getProducto()));
						bean.setProductoId(row.getProducto_id());
						bean.setTipoCampanaId(row.getTipo_campana_id());
						bean.setImagen(validaciones.validarCamposString(row.getImagen()));
						
					lista.add(bean);
				}
				response.setListaPrecioProducto(lista);
				response.setCodigoRespuesta(ConstantesInternasSistema.CODIGO_EXITO);
				response.setMensajeRespuesta(ConstantesInternasSistema.MENSAJE_EXITO);
			}else{
				response.setCodigoRespuesta(ConstModAdministracion.MANT_LISTAR_COD_IDF);
				response.setMensajeRespuesta(ConstModAdministracion.MANT_LISTAR_MSJ_IDF.replace("msj", mensajeTransaccionMetodo));
			}
			
		}catch(Exception e){
			System.out.println(mensajeTransaccionMetodo + "Hubo un error en el proceso" +e);
			response.setCodigoRespuesta(ConstModAdministracion.MANT_LISTAR_COD_IDT);
			response.setMensajeRespuesta(ConstModAdministracion.MANT_LISTAR_MSJ_IDT.replace("msj", mensajeTransaccionMetodo));
			return response;
		}
		
		return response;
	}

	@Override
	public GenericResponse nuevoPrecioPrducto(String codTransaccion, PrecioProductoBean request) {
		String mensajeTransaccionMetodo = "[nuevoPrecioPrducto idTx=" + codTransaccion + "] - ";
		GenericResponse response = new GenericResponse();
		try{
			GenericEntity resDao = null; 
			PrecioProductoRequest  bean = new PrecioProductoRequest ();
			bean.setActive(request.getActive());
			bean.setCategoriaClienteId(request.getCategoriaClienteId());
			bean.setAlmacenId(request.getAlmacenId());
			bean.setPrecioCampana(request.getPrecioNormal());
			bean.setPrecioNormal(request.getPrecioNormal());
			bean.setProductoId(request.getProductoId());
			bean.setTipoCampanaId(request.getTipoCampanaId());
			
			try{
				resDao = mantenimientoPrecioProductoDao.guardarPrecioProducto(bean);
			}catch(Exception e){
				System.out.println(mensajeTransaccionMetodo + "Hubo un error al registrar  en BD "+e );
				response.setCodigoRespuesta(ConstModAdministracion.MANT_NUEVO_COD_IDT);
				response.setMensajeRespuesta(ConstModAdministracion.MANT_NUEVO_MSJ_IDT.replace("msj", mensajeTransaccionMetodo));
				return response;
			}
			
			if(resDao.getCod_error() == Integer.valueOf(ConstantesInternasSistema.CODIGO_EXITO)){
				response.setCodigoRespuesta(ConstantesInternasSistema.CODIGO_EXITO);
				response.setMensajeRespuesta(ConstantesInternasSistema.MENSAJE_EXITO);
			}else{
				response.setCodigoRespuesta(ConstModAdministracion.MANT_NUEVO_COD_IDF);
				response.setMensajeRespuesta(ConstModAdministracion.MANT_NUEVO_MSJ_IDF.replace("msj", mensajeTransaccionMetodo));
			}
		}catch(Exception e){
			System.out.println(mensajeTransaccionMetodo + "Hubo un error en el proceso " +e);
			response.setCodigoRespuesta(ConstModAdministracion.MANT_NUEVO_COD_IDT);
			response.setMensajeRespuesta(ConstModAdministracion.MANT_NUEVO_MSJ_IDT.replace("msj", mensajeTransaccionMetodo));
			return response;
		}
		return response;
	}

	@Override
	public GenericResponse editarPrecioProducto(String codTransaccion, PrecioProductoBean request) {
		String mensajeTransaccionMetodo = "[editarPrecioProducto idTx=" + codTransaccion + "] - ";
		GenericResponse response = new GenericResponse();
		try{
			GenericEntity resDao = null; 
			PrecioProductoRequest  bean = new PrecioProductoRequest ();
			bean.setId(request.getId());
			bean.setActive(request.getActive());
			bean.setCategoriaClienteId(request.getCategoriaClienteId());
			bean.setAlmacenId(request.getAlmacenId());
			bean.setPrecioCampana(request.getPrecioNormal());
			bean.setPrecioNormal(request.getPrecioNormal());
			bean.setProductoId(request.getProductoId());
			bean.setTipoCampanaId(request.getTipoCampanaId());
			
			try{
				resDao = mantenimientoPrecioProductoDao.actualizarPrecioProducto(bean);
			}catch(Exception e){
				System.out.println(mensajeTransaccionMetodo + "Hubo un error al editar  en BD "+e );
				response.setCodigoRespuesta(ConstModAdministracion.MANT_EDITAR_COD_IDT);
				response.setMensajeRespuesta(ConstModAdministracion.MANT_EDITAR_MSJ_IDT.replace("msj", mensajeTransaccionMetodo));
				return response;
			}
			if(resDao.getCod_error() == Integer.valueOf(ConstantesInternasSistema.CODIGO_EXITO)){
				response.setCodigoRespuesta(ConstantesInternasSistema.CODIGO_EXITO);
				response.setMensajeRespuesta(ConstantesInternasSistema.MENSAJE_EXITO);
			}else{
				response.setCodigoRespuesta(ConstModAdministracion.MANT_EDITAR_COD_IDF);
				response.setMensajeRespuesta(ConstModAdministracion.MANT_EDITAR_MSJ_IDF.replace("msj", mensajeTransaccionMetodo));
			}
		}catch(Exception e){
			System.out.println(mensajeTransaccionMetodo + "Hubo un error en el proceso " +e);
			response.setCodigoRespuesta(ConstModAdministracion.MANT_EDITAR_COD_IDT);
			response.setMensajeRespuesta(ConstModAdministracion.MANT_EDITAR_MSJ_IDT.replace("msj", mensajeTransaccionMetodo));
			return response;
		}
		
		return response;
	}

	@Override
	public GenericResponse deletePrecioProducto(String codTransaccion, int codPrecioProducto) {
		String mensajeTransaccionMetodo = "[deletePrecioProducto idTx=" + codTransaccion + "] - ";
		GenericResponse response = new GenericResponse();
		try{
			
			GenericEntity resDao = mantenimientoPrecioProductoDao.eliminarPrecioProducto(codPrecioProducto);
			
			if(resDao.getCod_error() == Integer.valueOf(ConstantesInternasSistema.CODIGO_EXITO)){
				response.setCodigoRespuesta(ConstantesInternasSistema.CODIGO_EXITO);
				response.setMensajeRespuesta(ConstantesInternasSistema.MENSAJE_EXITO);
			}else{
				response.setCodigoRespuesta(ConstModAdministracion.MANT_ELIMINAR_COD_IDF);
				response.setMensajeRespuesta(ConstModAdministracion.MANT_ELIMINAR_MSJ_IDF.replace("msj", mensajeTransaccionMetodo));
			}
			
		}catch(Exception e){
			System.out.println(mensajeTransaccionMetodo + "Hubo un error al eliminar  en BD " +e);
			response.setCodigoRespuesta(ConstModAdministracion.MANT_EDITAR_COD_IDT);
			response.setMensajeRespuesta(ConstModAdministracion.MANT_EDITAR_MSJ_IDT.replace("msj", mensajeTransaccionMetodo));
		}
		
		return response;
	}

	@Override
	public GenericResponse enviarEmailBoletin(String codTransaccion, String asunto,String mensaje) {
		String mensajeTransaccionMetodo = "[enviarEmailBoletin idTx=" + codTransaccion + "] - ";
		GenericResponse response = new GenericResponse();
		
		try{
			//validamos que exista el asunto para el correo
			if(asunto.trim().length() < 1){
				response.setCodigoRespuesta(ConstantesInternasSistema.MAIL_ASUNTO_COD_IDF66);
				response.setMensajeRespuesta(ConstantesInternasSistema.MAIL_ASUNTO_MSJ_IDF66);
				return response;
			}
		}catch(Exception e){
			response.setCodigoRespuesta(ConstantesInternasSistema.MAIL_ASUNTO_COD_IDF66);
			response.setMensajeRespuesta(ConstantesInternasSistema.MAIL_ASUNTO_MSJ_IDF66);
			return response;
		}
		try{
			//validamos que exista el mensaje a enviar 
			if(mensaje.trim().length() < 1){
				response.setCodigoRespuesta(ConstantesInternasSistema.MAIL_CONTENIDO_COD_IDF67);
				response.setMensajeRespuesta(ConstantesInternasSistema.MAIL_CONTENIDO_MSJ_IDF67);
				return response;
			}
		}catch(Exception e){
			response.setCodigoRespuesta(ConstantesInternasSistema.MAIL_CONTENIDO_COD_IDF67);
			response.setMensajeRespuesta(ConstantesInternasSistema.MAIL_CONTENIDO_MSJ_IDF67);
			return response;
		}
		
		BoletinUsuarioListaResponse emailUsuarios = null;
		try{
			FiltrosSQLBean cadenaFiltros = new FiltrosSQLBean();
			 List<FiltrosBean> listaFiltros = new ArrayList<FiltrosBean>();
			 FiltrosBean filtroCampos = new FiltrosBean();
			 List<String> campos = new ArrayList<String>();
			 campos.add("active");
			 filtroCampos.setCampos(campos);
			 filtroCampos.setOperador("=");
			 listaFiltros.add(filtroCampos);
			 List<Object> valores = new ArrayList<Object>();
			 valores.add(true);
			 cadenaFiltros.setListaFiltros(listaFiltros);
			 cadenaFiltros.setListaValores(valores);
			//1.- obtenemos los correos que estan registrados para enviar las ofertas
			emailUsuarios = mantenimientoBoletin.listaBoletinUsuarios(codTransaccion, cadenaFiltros);
		}catch(Exception e){
			System.out.println(mensajeTransaccionMetodo + "Error al obtener los correos para el envio del email " + e.getMessage());
			response.setCodigoRespuesta(ConstantesInternasSistema.MAIL_CORREOS_COD_IDF65);
			response.setMensajeRespuesta(ConstantesInternasSistema.MAIL_CORREOS_MSJ_IDF65);
			return response;
		}
		
		if(!emailUsuarios.getCodigoRespuesta().equalsIgnoreCase(ConstantesInternasSistema.CODIGO_EXITO)){
			System.out.println(mensajeTransaccionMetodo+"No se encontro correo a enviar");
			response.setCodigoRespuesta(ConstantesInternasSistema.MAIL_CORREOS_COD_IDF65);
			response.setMensajeRespuesta(ConstantesInternasSistema.MAIL_CORREOS_MSJ_IDF65);
			return response;
		}
		StringBuilder listaEmail = new StringBuilder();
		
		for(BoletinBean ls : emailUsuarios.getListaBoletinUsuario()){
			listaEmail.append(ls.getEmail());
			listaEmail.append(",");
		}
		
		
		GenericResponse sendEmail = null;
		try{
			String correos = listaEmail.substring(0, listaEmail.length()-1);
			String correoUsuario = ConstantesInternasSistema.MAIL_USUARIO_SISTEMA;
			String clave = ConstantesInternasSistema.MAIL_CLAVE_SISTEMA;
			sendEmail = emailSenderService.sendEmail(codTransaccion, asunto, correos, correoUsuario, clave, mensaje);
		}catch(Exception e){
			System.out.println("Error al enviar los correos " + e.getMessage());
			response.setCodigoRespuesta(ConstantesInternasSistema.MAIL_CORREOS_COD_IDF65);
			response.setMensajeRespuesta(ConstantesInternasSistema.MAIL_CORREOS_MSJ_IDF65);
		}
		System.out.println("sendEmail.getCodigoRespuesta() : "+sendEmail.getCodigoRespuesta());
		if(sendEmail.getCodigoRespuesta().equalsIgnoreCase(ConstantesInternasSistema.CODIGO_EXITO)){
			System.out.println("Correos Enviados Correctamente ");
			response.setCodigoRespuesta(sendEmail.getCodigoRespuesta());
			response.setMensajeRespuesta(sendEmail.getMensajeRespuesta());
		}else{
			System.out.println("No se pudo Enviar los correos ");
			response.setCodigoRespuesta(sendEmail.getCodigoRespuesta());
			response.setMensajeRespuesta(sendEmail.getMensajeRespuesta());
		}
		
		return response;
	}

}
